/**
 * QQOauth.java
 */
package com.ozq.common.util;

import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.ozq.common.dao.entity.OauthConnectConfig;

/**
 * <QQ认证>
 * <p>
 * <功能详细描述>
 * 
 * @author 欧增奇
 * @version [版本号, 2017年10月15日]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public class QQOauthUtils
{
    static Logger logger = LoggerFactory.getLogger(QQOauthUtils.class);

    /**
     * 申请QQ登录成功后，分配给网站的appid。
     */
    public static final String APP_ID = "101429697";

    /**
     * 申请QQ登录成功后，分配给网站的appkey。
     */
    public static final String APP_KEY = "851c8daff190bc53b8c0f018410d1a1f";

    /**
     * 成功授权后的回调地址，必须是注册appid时填写的主域名下的地址，建议设置为网站首页或网站的用户中心。注意需要将url进行URLEncode。
     */
    public static final String REDIRECT_URI = "https://www.ouzengqi.com";

    /**
     * 类型标识
     */
    public static final String TYPE = "code";

    /**
     * 状态标识
     */
    public static final String STATE = "state";

    /**
     * 认证的URL
     */
    public static final String AUTHORIZE_URL = "https://graph.qq.com/oauth2.0/authorize";

    /**
     * 获取token的URL
     */
    public static final String ACCESS_TOKEN_URL = "https://graph.qq.com/oauth2.0/token";

    /**
     * 获取用户OpenID的URL
     * <p>
     * pc:https://graph.qq.com/oauth2.0/me <br>
     * WAP://graph.qq.com/oauth2.0/me
     */
    public static final String OPEN_ID_URL = "https://graph.qq.com/oauth2.0/me";

    /**
     * 获取用户基本信息的URL
     */
    public static final String GET_USER_INFO_URL = "https://graph.qq.com/user/get_user_info";

    /**
     * 获取认证的url
     * 
     * @return 生成完整认证的url地址
     */
    public static String getAuthorizeUrl(OauthConnectConfig oauthConnectConfig)
    {
        logger.debug("debug oauthConnectConfig:{}", oauthConnectConfig);

        if (StringUtils.isBlank(oauthConnectConfig.getUrl()))
            oauthConnectConfig.setUrl(REDIRECT_URI);

        String state = UuidUtils.shortUuid();
        oauthConnectConfig.setState(state);

        // 加入缓存方便确认
        CacheUtils.put(state, oauthConnectConfig);
        return AUTHORIZE_URL + "?client_id=" + APP_ID + "&redirect_uri=" + REDIRECT_URI + "&response_type=code&state=" + state;
    }

    /**
     * 解析url中的参数
     * 
     * @param url
     *            待解析的地址
     * @return map 键值对
     */
    public static Map<String, String> toMap(String url)
    {
        Map<String, String> map = null;
        if (url != null && url.indexOf("&") > -1 && url.indexOf("=") > -1)
        {
            map = new HashMap<String, String>();
            String[] arrTemp = url.split("&");
            for (String str : arrTemp)
            {
                String[] qs = str.split("=");
                map.put(qs[0], qs[1]);
            }
        }
        return map;
    }
}
